In [57]:
    
True and False
    
    Out[57]:
In [66]:
    
True or False and False
    
    Out[66]:
In [59]:
    
False and False
    
    Out[59]:
In [68]:
    
print((True or False) and False)
print(True or (False and False))
    
    
In [72]:
    
print(not False)
print(not True)
    
    
Look at truth tables to understand how values can be combined for these binary operators: https://en.wikipedia.org/wiki/Truth_table#Logical_conjunction_.28AND.29
Also understand the not unary operator: 
https://en.wikipedia.org/wiki/Truth_table#Logical_negation
In [73]:
    
def factorial(number):
    """
    Return the factorial of a passed number.
    e.g. if 5 is passed return: 5 * 4 * 3 * 2 * 1
    """
    if number == 0:
        return 1
    
    return number * factorial(number -1)
import math
print(factorial(5))
print(math.factorial(5))
    
    
In [83]:
    
import random 
def dealer_will_hit(cards_value):
    """Returns true if the dealer must take a hit"""
    if cards_value <= 16:
        return True
    
    return False
def should_i_hit(dealer_showing_value, my_cards_value):
    """Returns true if you should takea  hit"""        
    # Hit because you've got the space
    if my_cards_value <= 11:
        return True
    
    if my_cards_value >= 17 and my_cards_value <= 19:
        
        # Assume the dealer will bust
        if dealer_showing_value < 5:
            return False
        
        # Assume the dealer will beat you if you don't hit
        elif dealer_showing_value >= 7:
            return True
    
    # In all other cases see how it works out.
    return False
def get_card():
    card_values = [1,2,3,4,5,6,7,8,9,10,10,10,10]
    return random.choice(card_values)
def print_who_won(dealer_cards_value, my_cards_value):
    if my_cards_value > 21:
        print("Dealer won I busted")
        
    elif dealer_cards_value > 21:
        print("I won because dealer busted")
        
    elif dealer_cards_value > my_cards_value:
        print("Dealer won with higher value cards")
        
    elif my_cards_value > dealer_cards_value:
        print("I won with higher value cards")
    
    else:
        print("We tied! No one loses.")
# Setup the game
dealer_showing_card = get_card()
dealer_card_values = dealer_showing_card + get_card()
player_cards_value = get_card() + get_card()
# Check to see if the player should hit
# Only going to hit once
if should_i_hit(dealer_showing_card, player_cards_value):
    player_cards_value += get_card()
# Same the dealer will only hit once
if dealer_will_hit(dealer_card_values):
    dealer_card_values += get_card()
    
print("Dealer ended with: ", dealer_card_values)
print("I ended with: ", player_cards_value)
print_who_won(dealer_card_values, player_cards_value)
    
    
In [82]:
    
def no_return():
    print('hi')
def has_return():
    return 'hi'
print(has_return() + ' Hello')
print(type(no_return()))
print(no_return() + ' Hello')
    
    
    
In [97]:
    
x = 8
if x < 15:
    print('less than 15')
    
    if x < 13:
        print('less than 13')
        
        if x < 9:
            print('less than 9')
    
    print('always printed if less than 15')
else:
    print('bye')
print('super default')
    
    
In [101]:
    
print('   hi')
print('\t\t\thi')
    
    
In [109]:
    
temp = [0, 1, 5, 3, 10]
some_number = 11
def contains_n(list_of_numbers, test_number):
    """
    Tests if the passed `test_number` is equal
    to a value inside `list_of_numbers`
    """
    for number in list_of_numbers:
        # executions
        #
        # number = 0 
        # number = 1
        # number = 5
        # number = 3
        # number = 10
        if number == test_number:
            return True
        
    return False
def contains_type_and_value_n(numbers, n):
    """
    Tests if the passed `test_number` is equal
    to a value inside `list_of_numbers` as well
    as the value's type.
    """
    for num in numbers:
        if num == n and type(num) == type(n):
            return True
    return False
def contains_number_of_n(numbers, n):
    count = 0
    for num in numbers:
        if num == n:
            count += 1
    return count
def contains_number_of_type_n(numbers, n):
    count = 0
    for num in numbers:
        if num == n and type(num) == type(n):
            count += 1
    return count
        
print(contains_n([5, 7, 9, 10], 6))
print(contains_type_and_value_n([5, 6.2, 5.8, 9], 5))
print(contains_number_of_n([5, 7, 9, 10, 9], 9))
print(contains_number_of_type_n([5, 7, 9, 10.0, 9], 10))
print(type(10))
print(type(10.0000))
    
    
In [118]:
    
def contains(numbers, n):
    return n in numbers
def count(numbers, n):
    return numbers.count(n)
numbers = [2, 3.0, 3, 5.0, 6.666, 4]
value = 4.0
value2 = 5.0
print(
    contains(numbers, value),
    contains(numbers, value),
    '\n',
    contains(numbers, value2),
    contains(numbers, value2)
)
# in operator: https://docs.python.org/3.4/reference/expressions.html#in
    
    
In [ ]: